package com.zeng.config;

import com.zeng.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @author Zqm
 * @Title: MyConfigOfLifeCycle
 * @ProjectName SpringAnnotationDriven
 * @date 2019/1/14
 * bean的生命周期
 * 创建 初始化 销毁的过程
 *
 * 现在是由容器来管理 bean的生命周期
 *我们可以自定义初始化  销毁方法  容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
 *
 * 构造(对象创建)
 *      单实例，在容器启动的时候创建对象
 *      多实例，在每次获取的时候创建对象  (什么时候调用什么时候执行 初始化 销毁 等同)
 *初始化
 *      对象创建完成,bean复制好 调用初始化方法
 *销毁
 *      单实例：容器关闭的时候销毁
 *      多实例：容器不会调用销毁方法
 *
 * 遍历得到容器中所有的BeanPostProcessor 挨个执行BeforeInitialization  一单返回null后置处理器就跳出循环 不会执行后面的BeanPostProcessor
 * populateBean(beanName, mbd, instanceWrapper); 给bean进行属性赋值
 * initializeBean  在进行初始化
 *{
 *  applyBeanPostProcessorsBeforeInitialization(bean, beanName);
 *  invokeInitMethods(beanName, wrappedBean, mbd);  执行初始化
 *  applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *}
 *
 * 1.指定初始化和销毁方法
 *      通过@bean注解 指定init-method destroy-method  传统xml  也是差不多
 *
 * 2.通过让bean实现  InitializingBean(接口定义初始化)
 *                  DisposableBean(销毁逻辑)
 *
 * 3.可以用KSR250 注解实现
 *      @PostConstruct 在Bean创建完成 并且属性赋值完成来执行初始化
 *      @PreDestroy 当Bean在容器销毁之前 进行调用
 *
 * 4.BeanPostProcessor bean 后置处理器
 *      在bean初始化前后进行一些初始化工作
 *      postProcessBeforeInitialization  初始化之前
 *      postProcessAfterInitialization   初始化之后
 *
 *
 *Spring 底层对BeanPostProcessor的使用
 *      bean的赋值 和autowired 注入其他组件 生命周期功能BeanPostProcessor的作用
 */
@ComponentScan("com.zeng.bean")
@Configuration
public class MyConfigOfLifeCycle {

//    @Scope("prototype")
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }



}
